package com.example.redismodule.bloom;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author：DijaH
 * @Date：2024/3/15 14:53
 * @Version：1.0.0
 * @Description：
 * 取样本100w数据，查查不在100w范围内，其他10w数据是否存在
 */
@Service
@Slf4j
public class GuavaBloomFilterService {

    public static final int _1w = 10000;

    //布隆过滤器中预计要插入多少数据
    public static int size = 100 * _1w;
    //误判率，他越小误判的个数也就越少（思考：是不是可以设置的无限小，没有误判岂不更好？）
    public static double fpp = 0.03;
    //构建布隆过滤器
    private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(),size,fpp);
    public void guavaBloomFilter(){
        //1,先网布隆过滤器中插入100w的样本数据
        for(int i =1; i<=size;i++){
            bloomFilter.put(i);
        }
        //故意取10w个不在过滤器中的值，看看有多少个会被认为在过滤器中
        List<Integer> list = new ArrayList<>(10 * _1w);
        for (int i = size + 1;i<=size+(10*_1w);i++){
            if(bloomFilter.mightContain(i)){
                log.info("被误判={}",i);
                list.add(i);
            }
        }
        log.info("被误判的数量：{}",list.size());
    }
}
